﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SoftwareConsulting.BI11.NumericalMethods.NonLinearEquations
{
    /// <summary>
    /// Класс метода Ньютона для решения нелинейный алгебраических уравнений
    /// </summary>
    public class NewtonMethod 
    {
        private double[,] _result;

        /// <summary>
        /// Конструктор класса
        /// </summary>
        /// <param name="function">Функция, требующая решения</param>
        /// <param name="initialValue">Начальное значение</param>
        /// <param name="divisionsCount">Число разбиений</param>
        public NewtonMethod(FunctionWithOneArgument function, double initialValue, double divisionsCount)
        {
            _result = new double[2, 10];
            int t = 0;
            double x1, y;
            do
            {
                t++;
                x1 = initialValue - function(initialValue) / GetDerivative(initialValue, divisionsCount, function);
                initialValue = x1;
                y = function(initialValue);
            }
            while (Math.Abs(y) >= divisionsCount);
            _result[0, 0] = initialValue;
            _result[1, 0] = t;
        }

        /// <summary>
        /// Возвращает отношение прирощения функции к прирощению аргумента
        /// </summary>
        /// <param name="initialValue">Начальное значение</param>
        /// <param name="divisionsCount">Число разбиений</param>
        /// <param name="function">Функция, требующая решения</param>
        private double GetDerivative(double initialValue, double divisionsCount, FunctionWithOneArgument function)
        {
            return (function(initialValue + divisionsCount) - function(initialValue)) / divisionsCount;
        }

        /// <summary>
        /// Возвращает решение
        /// </summary>        
        public double[,] GetSolution()
        {
            return _result;
        }
    }
}
